#ifndef MODBUS_SERIALPORT_H
#define MODBUS_SERIALPORT_H

#include <QObject>
#include <QModbusClient>
#include <QModbusDataUnit>
#include <QModbusTcpClient>       // 如果使用TCP连接
#include <QModbusRtuSerialMaster> // 如果使用串口连接
#include <QJsonDocument>          // 解析 JSON 文档
#include <QJsonObject>            // 操作 JSON 对象
#include <QJsonArray>             // 操作 JSON 数组
#include <QJsonValue>             // 处理 JSON 值
#include <QDebug>                 // 调试输出（用于 qDebug）
#include <QString>                // 字符串操作
#include <QTimer>                 // 定时器
#include <QMap>
#include <QVector>
#include <QSerialPort>
#include <QMutex>
#include <QRandomGenerator>

// #define TEST_DATA

class modbus_serialport : public QObject
{
    Q_OBJECT
public:
    modbus_serialport(QObject *parent = nullptr);
    bool processJsonCommand(const QString &jsonStr, QString *err);
signals:
    void signalToForward(const QString &msg);
private slots:
    void onPollTimerTimeout();    // 定时器触发时的处理函数
    void onModbusReplyFinished(); // Modbus 应答处理函数
    void handleModbusError(QModbusDevice::Error error);

private:
    // 定义 Modbus 帧结构
    struct ModbusFrame
    {
        int startId;    // 起始寄存器 ID
        int count;      // 连续寄存器数量
        QList<int> ids; // 包含的所有 ID

        ModbusFrame(int start, int cnt) : startId(start), count(cnt) {}
    };
    QMutex replyMutex;
    QMutex framesMutex; // 用于保护 modbus_frames 的互斥锁
    QMap<QString, QString> modbus_id_value_map;
    QString modbus_json = "";
    QVector<ModbusFrame> modbus_frames;
    QModbusClient *modbusClient; // Modbus 客户端
    QTimer pollTimer;            // 定时器
    // QTimer jsonUpdateTimer;               // json更新定时器
    int currentFrameIndex = 0;            // 当前发送的帧索引
    QModbusReply *currentReply = nullptr; // 当前的 Modbus 请求
    QString uartChannal;                  // 串口通道
    void groupContinuousIDs(QVector<ModbusFrame> &frames, int maxRegistersPerFrame = 125);
    void writeChannelConfiguration(int channalId);
    void initializeModbusDevice(const QString &portName);
    void sendNextFrame(); // 发送下一帧
    void updateJsonAndSend();
    QString modifyJsonData(const QString &jsonInput);
};

#endif // MODBUS_SERIALPORT_H
